package java学习.第17章_反射机制;


import org.junit.Test;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Modifier;
//如修饰符   类型   变量名 等
public class G2_反射属性的操作 {

    @Test
    public void 反射获取属性() {
        Class<FS> fsClass = FS.class;
        //只能获取当前运行时类及父类的public属性
        System.out.println("****************getFields()***********************************");
        Field[] fields = fsClass.getFields();
        for (Field f:fields){
            System.out.println("public的属性:"+f);
        }

        System.out.println("*****************getDeclaredFields()**********************************");
        //获取当前运行时类中声明的所有属性。（不包含父类中声明的属性）
        Field[] declaredFields = fsClass.getDeclaredFields();
        for (Field f:declaredFields){
            System.out.println("*****************详细信息*************");
            System.out.println(f);////当前运行时类中声明的所有属性
            System.out.println(f.getModifiers()+//2 private
                    " 对相应的修饰符 "+//1  public    0:缺省   4:protected
                    //如果   有static或者volatile或者final或者等等等等  会有不同的值
                    Modifier.toString(f.getModifiers()));//获得f的权限修饰符
            Class<?> type = f.getType();
            System.out.println(type);//类型

            System.out.println("变量名"+f.getName());//变量名
        }
    }
    @Test
    public void 调用属性() throws InstantiationException, IllegalAccessException, NoSuchFieldException, NoSuchMethodException, InvocationTargetException {
        Class<FS> fsClass = FS.class;
//        FS fs = fsClass.newInstance();//jdk 9废弃
        FS fs = fsClass.getDeclaredConstructor().newInstance();//新的

        System.out.println("-----------反射调用普通属性------------------");
        //name 是私有的  需要给权限
        Field name = fsClass.getDeclaredField("name");
        name.setAccessible(true);//给次属性赋予私有调用的权限
        name.set(fs,"修改属性名字");//给fs的属性赋值
        System.out.println(name.get(fs));//获取fs的name属性

        System.out.println("-----------反射调用静态属性------------------");
        Field staname = fsClass.getDeclaredField("staname");
        staname.set(FS.class,"修改静态属性名字");//给fs的静态属性赋值
        System.out.println(staname.get(FS.class));//获取fs的静态属性
        staname.set(null,"修改静态属性名字");//给fs的静态属性赋值
        System.out.println(staname.get(null));//获取fs的静态属性

    }
}
